package Structures;

/**
 * Instancia las aristas para el grafo dirigido, para conectar cada nodo
 * @author Jeremy
 * @author Rodrigo
 * @author Alexandre
 * @author Gabriel
 */
public class Edge {

    private int _attribute; //Etiqueta de la arista.
    private Node _source, _dest; //Referencia al nodo destino y fuente.
    private Edge _nextOutEdge; //Referencia a la siguiente arista del nodo. 

    /**
     * Construye una nueva arista con un nodo fuente, uno destino y su atributo o peso.
     * @param pSource Nodo fuente
     * @param pDest Nodo destino
     * @param pAttribute Atributo o peso
     */
    public Edge (Node pSource, Node pDest, int pAttribute) {
        this._attribute = pAttribute;
        this._source = pSource;
        this._dest = pDest;
        _nextOutEdge = null;
    }
    
    /**
     * Construye una nueva arista sin un peso definido, solo con sus nodos fuente y destino.
     * @param pSource Nodo fuente de donde sale la arista
     * @param pDest Nodo destino hacia donde se dirige la arista
     */
    public Edge (Node pSource, Node pDest) {
        _attribute = 0;
        this._source = pSource;
        this._dest = pDest;
        _nextOutEdge = null;
    }
       
    //////////////////////////////Getters y setters/////////////////////////////
    /**
     * Obtiene el atributo o peso de la arista
     * @return Attributo
     */
    public int getAttribute() {
        return _attribute;
    }
    
    /**
     * Establece el atributo para la arista
     * @param pAt Atributo para establecer
     */
    public void setAttribute(int pAt) {
        _attribute = pAt;
    }
    
    /**
     * Obtiene el nodo fuente
     * @return Nodo fuente
     */
    public Node getSource() {
        return _source;
    }
    
    /**
     * Establece el nodo fuente de la conexion.
     * @param pNode Nodo para establecer
     */
    public void setSource(Node pNode) {
        _dest = pNode;
    }
    
    /**
     * Obtiene el nodo destino
     * @return Nodo destino
     */
    public Node getDest() {
        return _dest;
    }
    
    /**
     * Establece el nodo destino para la arista.
     * @param pNode Nodo para establecer
     */
    public void setDest(Node pNode) {
        _dest = pNode;
    }

    /**
     * Obtiene la siguiente arista en la lista de conexiones del nodo
     * @return Siguiente arista
     */
    public Edge getNextOutEdge() {
        return _nextOutEdge;
    }

    /**
     * Establece la arista siguiente a esta, en la lista de conexiones del nodo.
     * @param pNextOutEdge Arista para establecer
     */
    public void setNextOutEdge(Edge pNextOutEdge) {
        this._nextOutEdge = pNextOutEdge;
    }
    ////////////////////////////////////////////////////////////////////////////
    
    /**
     * Metodo que retorna un arreglo de los nodos fuente y destino de una
     * determinada arista.
     * @return 
     */
    public Node[] getNodes() {
        Node[] nodes = new Node[2];
            
        nodes[0] = _source;
        nodes[1] = _dest;
          
        return nodes;
    }
}